/* 
作用：泛型（Generics）可以在保证类型安全前提下，
      给别名、接口、函数等添加类型参数，从而实现复用
在TypeScript中，泛型是一种创建可复用代码组件的工具。
这种组件不只能被一种类型使用，而是能被多种类型复用。
类似于参数的作用，泛型是一种用以增强类型（types）、
接口（interfaces）、函数类型等能力的非常可靠的手段。
*/


//语法：type 类型别名<Type1,Type2,...>={}

//之前写的type 类型别名
//属性名和属性值是固定的
type Objtype = {
    name: string,
    age: number
}
let obj: Objtype = {
    name: "123",
    age: 34
}

//定义泛型别名
//属性名是固定的，属性值是变化的，根据传的值变化
type Data<T> = {
    status: number,
    msg: string,
    data: T
}

//这里传什么，下面data的属性值就是什么
let obj2: Data<[]> = {
    status: 200,
    msg: "success",
    data: []
}
let obj3: Data<{}> = {
    status: 200,
    msg: "success",
    data: {}
}

//传多个参数
type User = {
    name: string,
    id: number
}
type Goods = {
    title: string,
    id: number
}
type MyData<T> = {
    status: number,
    msg: string,
    data: T
}

//可以直接传类型
let aaa: MyData<number> = {
    status: 200,
    msg: "200",
    data: 123
}
//也可以将上面定义的类型别名直接传进来
let aaa2: MyData<User> = {
    status: 200,
    msg: "200",
    data: {
        name: "123",
        id: 2222
    }
}


type MyData2<T, A> = {
    status: number,
    msg: string,
    data: T,
    info: A
}
let ccc: MyData2<number, string> = {
    status: 200,
    msg: "200",
    data: 123,
    info: "123"
}
let ccc2: MyData2<User, Goods> = {
    status: 200,
    msg: "200",
    data: {
        name: "123",
        id: 2222
    },
    info: {
        title: "123",
        id: 2222
    }
}
export { }